package top.szhome.framework.core.tools.util;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;

/**
 * @author 唐加利
 * @date 2023/7/23
 **/
public class ObjectUtil {

    /**
     * 检测两个对象是否相同
     * @param one       对象之一
     * @param other     另一对象
     * @return 对象相同返回true，反之返回false
     */
    public static boolean equals(Object one, Object other){
        return Objects.equals(one, other);
    }

    /**
     * 检测两个对象是否不同
     * @param one       对象之一
     * @param other     另一对象
     * @return 对象不同返回true，反之返回false
     */
    public static boolean notEquals(Object one, Object other){
        return !equals(one, other);
    }

    /**
     * 检测对象是否为空
     * @param obj   对象
     * @return  如果检测对象为null，返回true，反之返回false
     */
    public static boolean isNull(Object obj){
        return obj == null;
    }

    /**
     * 检测对象是否为空，可以检测字符串、数组、集合、Map等类型对象
     * @param object   待检测对象
     * @return 如果对象为空，返回true；反之返回false
     */
    public static boolean isEmpty(Object object){
        if (object == null) {
            return true;
        }

        if (object instanceof CharSequence) {
            return StringUtil.isBlank((CharSequence) object);
        }

        if (object.getClass().isArray()) {
            return Array.getLength(object) == 0;
        }

        if (object instanceof Collection<?>) {
            return ((Collection<?>) object).isEmpty();
        }

        if (object instanceof Map<?, ?>) {
            return ((Map<?, ?>) object).isEmpty();
        }

        return false;
    }

    /**
     * 检测对象是否不为空，可以检测字符串、数组、集合、Map等类型对象
     * @param object   待检测对象
     * @return 如果对象不为空，返回true；反之返回false
     */
    public static boolean notEmpty(Object object){
        return !isEmpty(object);
    }

    /**
     * 如果对象为空，返回默认数据
     * @param obj   源数据
     * @param def   默认值
     * @param <T> 数据类型
     * @return 如果源数据为null，返回默认值，否则返回源数据
     */
    public static <T> T value(T obj, T def) {
        return isNull(obj) ? def : obj;
    }

}
